/******************************************************************************
 *
 *  Copyright (C) 2010-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This is the public interface file for NFA P2P, Broadcom's NFC
 *  application layer for mobile phones.
 *
 ******************************************************************************/
#ifndef NFA_P2P_API_H
#define NFA_P2P_API_H

#include "llcp_api.h"
#include "nfa_api.h"

/*****************************************************************************
**  Constants and data types
*****************************************************************************/

/* NFA P2P Reason of disconnection */
#define NFA_P2P_DISC_REASON_REMOTE_INITIATE	    0x00    /* remote initiated to disconnect  */
#define NFA_P2P_DISC_REASON_LOCAL_INITITATE	    0x01    /* local initiated to disconnect   */
#define NFA_P2P_DISC_REASON_NO_SERVICE	        0x02    /* no service bound in remote      */
#define NFA_P2P_DISC_REASON_REMOTE_REJECT	    0x03    /* remote rejected connection      */
#define NFA_P2P_DISC_REASON_FRAME_ERROR	        0x04    /* sending or receiving FRMR PDU   */
#define NFA_P2P_DISC_REASON_LLCP_DEACTIVATED	0x05    /* LLCP link deactivated           */
#define NFA_P2P_DISC_REASON_NO_RESOURCE	        0x06    /* Out of resource in local device */
#define NFA_P2P_DISC_REASON_NO_INFORMATION	    0x80    /* Without information             */

/* NFA P2P callback events */
#define NFA_P2P_REG_SERVER_EVT      0x00    /* Server is registered                         */
#define NFA_P2P_REG_CLIENT_EVT      0x01    /* Client is registered                         */
#define NFA_P2P_ACTIVATED_EVT       0x02    /* LLCP Link has been activated                 */
#define NFA_P2P_DEACTIVATED_EVT	    0x03    /* LLCP Link has been deactivated               */
#define NFA_P2P_CONN_REQ_EVT        0x04    /* Data link connection request from peer       */
#define NFA_P2P_CONNECTED_EVT       0x05    /* Data link connection has been established    */
#define NFA_P2P_DISC_EVT            0x06    /* Data link connection has been disconnected   */
#define NFA_P2P_DATA_EVT            0x07    /* Data received from peer                      */
#define NFA_P2P_CONGEST_EVT         0x08    /* Status indication of outgoing data           */
#define NFA_P2P_LINK_INFO_EVT       0x09    /* link MIU and Well-Known Service list         */
#define NFA_P2P_SDP_EVT	            0x0A    /* Remote SAP of SDP result                     */

typedef UINT8 tNFA_P2P_EVT;

/* NFA allocates a SAP for server */
#define NFA_P2P_ANY_SAP         LLCP_INVALID_SAP
#define NFA_P2P_INVALID_SAP     LLCP_INVALID_SAP

/* Recommanded MIU's for connection-oriented */
#define NFA_P2P_MIU_1           (NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
#define NFA_P2P_MIU_2           (2*NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
#define NFA_P2P_MIU_3           (3*NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)
#define NFA_P2P_MIU_8           (8*NCI_NFC_DEP_MAX_DATA - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE)

#define NFA_P2P_LLINK_TYPE      LLCP_LINK_TYPE_LOGICAL_DATA_LINK
#define NFA_P2P_DLINK_TYPE      LLCP_LINK_TYPE_DATA_LINK_CONNECTION
typedef UINT8 tNFA_P2P_LINK_TYPE;

/* Data for NFA_P2P_REG_SERVER_EVT */
typedef struct
{
    tNFA_HANDLE     server_handle;     /* NFA_HANDLE_INVALID if failed */
    char            service_name[LLCP_MAX_SN_LEN + 1];
    UINT8           server_sap;
} tNFA_P2P_REG_SERVER;

/* Data for NFA_P2P_REG_CLIENT_EVT */
typedef struct
{
    tNFA_HANDLE     client_handle;     /* NFA_HANDLE_INVALID if failed */
} tNFA_P2P_REG_CLIENT;

/* Data for NFA_P2P_ACTIVATED_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    UINT16          local_link_miu;
    UINT16          remote_link_miu;
} tNFA_P2P_ACTIVATED;

/* Data for NFA_P2P_DEACTIVATED_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
} tNFA_P2P_DEACTIVATED;

/* Data for NFA_P2P_CONN_REQ_EVT */
typedef struct
{
    tNFA_HANDLE     server_handle;
    tNFA_HANDLE     conn_handle;
    UINT8           remote_sap;
    UINT16          remote_miu;
    UINT8           remote_rw;
} tNFA_P2P_CONN_REQ;

/* Data for NFA_P2P_CONNECTED_EVT */
typedef struct
{
    tNFA_HANDLE     client_handle;
    tNFA_HANDLE     conn_handle;
    UINT8           remote_sap;
    UINT16          remote_miu;
    UINT8           remote_rw;
} tNFA_P2P_CONN;

/* Data for NFA_P2P_DISC_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    UINT8           reason;
} tNFA_P2P_DISC;

/* Data for NFA_P2P_DATA_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    UINT8           remote_sap;
    tNFA_P2P_LINK_TYPE link_type;
} tNFA_P2P_DATA;

/* Data for NFA_P2P_CONGEST_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    BOOLEAN         is_congested;
    tNFA_P2P_LINK_TYPE link_type;
} tNFA_P2P_CONGEST;

/* Data for NFA_P2P_LINK_INFO_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    UINT16          wks;            /* well-known service */
    UINT16          local_link_miu;
    UINT16          remote_link_miu;
} tNFA_P2P_LINK_INFO;

/* Data for NFA_P2P_SDP_EVT */
typedef struct
{
    tNFA_HANDLE     handle;
    UINT8           remote_sap;     /* 0x00 if failed */
} tNFA_P2P_SDP;

/* Union of all P2P callback structures */
typedef union
{
    tNFA_P2P_REG_SERVER     reg_server;     /* NFA_P2P_REG_SERVER_EVT   */
    tNFA_P2P_REG_CLIENT     reg_client;     /* NFA_P2P_REG_CLIENT_EVT   */
    tNFA_P2P_ACTIVATED      activated;      /* NFA_P2P_ACTIVATED_EVT    */
    tNFA_P2P_DEACTIVATED    deactivated;    /* NFA_P2P_DEACTIVATED_EVT  */
    tNFA_P2P_CONN_REQ       conn_req;       /* NFA_P2P_CONN_REQ_EVT     */
    tNFA_P2P_CONN           connected;      /* NFA_P2P_CONNECTED_EVT    */
    tNFA_P2P_DISC           disc;           /* NFA_P2P_DISC_EVT         */
    tNFA_P2P_DATA           data;           /* NFA_P2P_DATA_EVT         */
    tNFA_P2P_CONGEST        congest;        /* NFA_P2P_CONGEST_EVT      */
    tNFA_P2P_LINK_INFO      link_info;      /* NFA_P2P_LINK_INFO_EVT    */
    tNFA_P2P_SDP            sdp;            /* NFA_P2P_SDP_EVT          */
} tNFA_P2P_EVT_DATA;

/* NFA P2P callback */
typedef void (tNFA_P2P_CBACK)(tNFA_P2P_EVT event, tNFA_P2P_EVT_DATA *p_data);

/*****************************************************************************
**  External Function Declarations
*****************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif

/*******************************************************************************
**
** Function         NFA_P2pRegisterServer
**
** Description      This function is called to listen to a SAP as server on LLCP.
**
**                  NFA_P2P_REG_SERVER_EVT will be returned with status and handle.
**
**                  If server_sap is set to NFA_P2P_ANY_SAP, then NFA will allocate
**                  a SAP between LLCP_LOWER_BOUND_SDP_SAP and LLCP_UPPER_BOUND_SDP_SAP
**                  Otherwise, server_sap must be between (LLCP_SDP_SAP + 1) and
**                  LLCP_UPPER_BOUND_SDP_SAP
**
**                  link_type : NFA_P2P_LLINK_TYPE and/or NFA_P2P_DLINK_TYPE
**
** Note:            If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
**                  should happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pRegisterServer (UINT8              server_sap,
                                                  tNFA_P2P_LINK_TYPE link_type,
                                                  char              *p_service_name,
                                                  tNFA_P2P_CBACK    *p_cback);

/*******************************************************************************
**
** Function         NFA_P2pRegisterClient
**
** Description      This function is called to register a client service on LLCP.
**
**                  NFA_P2P_REG_CLIENT_EVT will be returned with status and handle.
**
**                  link_type : NFA_P2P_LLINK_TYPE and/or NFA_P2P_DLINK_TYPE
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pRegisterClient (tNFA_P2P_LINK_TYPE link_type,
                                                  tNFA_P2P_CBACK *p_cback);

/*******************************************************************************
**
** Function         NFA_P2pDeregister
**
** Description      This function is called to stop listening to a SAP as server
**                  or stop client service on LLCP.
**
** Note:            If this function is called to de-register a server and RF discovery
**                  is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT
**                  should happen before calling this function
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pDeregister (tNFA_HANDLE handle);

/*******************************************************************************
**
** Function         NFA_P2pAcceptConn
**
** Description      This function is called to accept a request of data link
**                  connection to a listening SAP on LLCP after receiving
**                  NFA_P2P_CONN_REQ_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pAcceptConn (tNFA_HANDLE conn_handle,
                                              UINT16      miu,
                                              UINT8       rw);

/*******************************************************************************
**
** Function         NFA_P2pRejectConn
**
** Description      This function is called to reject a request of data link
**                  connection to a listening SAP on LLCP after receiving
**                  NFA_P2P_CONN_REQ_EVT.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pRejectConn (tNFA_HANDLE conn_handle);

/*******************************************************************************
**
** Function         NFA_P2pDisconnect
**
** Description      This function is called to disconnect an existing or
**                  connecting data link connection.
**
**                  discard any pending data on data link connection if flush is set to TRUE
**
**                  NFA_P2P_DISC_EVT will be returned after data link connection is disconnected
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pDisconnect (tNFA_HANDLE conn_handle,
                                              BOOLEAN     flush);

/*******************************************************************************
**
** Function         NFA_P2pConnectByName
**
** Description      This function is called to create a connection-oriented transport
**                  by a service name.
**                  NFA_P2P_CONNECTED_EVT if success
**                  NFA_P2P_DISC_EVT if failed
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if client is not registered
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pConnectByName (tNFA_HANDLE client_handle,
                                                 char       *p_service_name,
                                                 UINT16      miu,
                                                 UINT8       rw);

/*******************************************************************************
**
** Function         NFA_P2pConnectBySap
**
** Description      This function is called to create a connection-oriented transport
**                  by a SAP.
**                  NFA_P2P_CONNECTED_EVT if success
**                  NFA_P2P_DISC_EVT if failed
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if client is not registered
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pConnectBySap (tNFA_HANDLE client_handle,
                                                UINT8       dsap,
                                                UINT16      miu,
                                                UINT8       rw);

/*******************************************************************************
**
** Function         NFA_P2pSendUI
**
** Description      This function is called to send data on connectionless
**                  transport.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_BAD_LENGTH if data length is more than remote link MIU
**                  NFA_STATUS_CONGESTED  if congested
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pSendUI (tNFA_HANDLE handle,
                                          UINT8       dsap,
                                          UINT16      length,
                                          UINT8      *p_data);

/*******************************************************************************
**
** Function         NFA_P2pReadUI
**
** Description      This function is called to read data on connectionless
**                  transport when receiving NFA_P2P_DATA_EVT with NFA_P2P_LLINK_TYPE.
**
**                  - Remote SAP who sent UI PDU is returned.
**                  - Information of UI PDU up to max_data_len is copied into p_data.
**                  - If more information of UI PDU or more UI PDU in queue then more
**                    is returned to TRUE.
**                  - Information of next UI PDU is not concatenated.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pReadUI (tNFA_HANDLE handle,
                                          UINT32      max_data_len,
                                          UINT8       *p_remote_sap,
                                          UINT32      *p_data_len,
                                          UINT8       *p_data,
                                          BOOLEAN     *p_more);

/*******************************************************************************
**
** Function         NFA_P2pFlushUI
**
** Description      This function is called to flush data on connectionless
**                  transport.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pFlushUI (tNFA_HANDLE handle,
                                           UINT32      *p_length);

/*******************************************************************************
**
** Function         NFA_P2pSendData
**
** Description      This function is called to send data on connection-oriented
**                  transport.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_BAD_LENGTH if data length is more than remote MIU
**                  NFA_STATUS_CONGESTED  if congested
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pSendData (tNFA_HANDLE conn_handle,
                                            UINT16      length,
                                            UINT8      *p_data);

/*******************************************************************************
**
** Function         NFA_P2pReadData
**
** Description      This function is called to read data on connection-oriented
**                  transport when receiving NFA_P2P_DATA_EVT with NFA_P2P_DLINK_TYPE.
**
**                  - Information of I PDU is copied into p_data up to max_data_len.
**                  - If more information of I PDU or more I PDU in queue, then more
**                    is returned to TRUE.
**                  - Information of next I PDU is not concatenated.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pReadData (tNFA_HANDLE handle,
                                            UINT32      max_data_len,
                                            UINT32      *p_data_len,
                                            UINT8       *p_data,
                                            BOOLEAN     *p_more);

/*******************************************************************************
**
** Function         NFA_P2pFlushData
**
** Description      This function is called to flush data on connection-oriented
**                  transport.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pFlushData (tNFA_HANDLE handle,
                                             UINT32      *p_length);

/*******************************************************************************
**
** Function         NFA_P2pSetLocalBusy
**
** Description      This function is called to stop or resume incoming data on
**                  connection-oriented transport.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if handle is not valid
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pSetLocalBusy (tNFA_HANDLE conn_handle,
                                                BOOLEAN     is_busy);

/*******************************************************************************
**
** Function         NFA_P2pGetLinkInfo
**
** Description      This function is called to get local/remote link MIU and
**                  Well-Known Service list encoded as a 16-bit field of connected LLCP.
**                  NFA_P2P_LINK_INFO_EVT will be returned.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if server or client is not registered
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pGetLinkInfo (tNFA_HANDLE handle);

/*******************************************************************************
**
** Function         NFA_P2pGetRemoteSap
**
** Description      This function is called to get SAP associated by service name
**                  on connected remote LLCP.
**                  NFA_P2P_SDP_EVT will be returned.
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_BAD_HANDLE if server or client is not registered
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pGetRemoteSap (tNFA_HANDLE handle,
                                                char       *p_service_name);

/*******************************************************************************
**
** Function         NFA_P2pSetLLCPConfig
**
** Description      This function is called to change LLCP config parameters.
**                  Application must call while LLCP is not activated.
**
**                  Parameters descriptions (default value)
**                  - Local Link MIU (LLCP_MIU)
**                  - Option parameter (LLCP_OPT_VALUE)
**                  - Response Waiting Time Index (LLCP_WAITING_TIME)
**                  - Local Link Timeout (LLCP_LTO_VALUE)
**                  - Inactivity Timeout as initiator role (LLCP_INIT_INACTIVITY_TIMEOUT)
**                  - Inactivity Timeout as target role (LLCP_TARGET_INACTIVITY_TIMEOUT)
**                  - Delay SYMM response (LLCP_DELAY_RESP_TIME)
**                  - Data link connection timeout (LLCP_DATA_LINK_CONNECTION_TOUT)
**                  - Delay timeout to send first PDU as initiator (LLCP_DELAY_TIME_TO_SEND_FIRST_PDU)
**
** Returns          NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
NFC_API extern tNFA_STATUS NFA_P2pSetLLCPConfig (UINT16 link_miu,
                                                 UINT8  opt,
                                                 UINT8  wt,
                                                 UINT16 link_timeout,
                                                 UINT16 inact_timeout_init,
                                                 UINT16 inact_timeout_target,
                                                 UINT16 symm_delay,
                                                 UINT16 data_link_timeout,
                                                 UINT16 delay_first_pdu_timeout);

/*******************************************************************************
**
** Function         NFA_P2pGetLLCPConfig
**
** Description      This function is called to read LLCP config parameters.
**
**                  Parameters descriptions
**                  - Local Link MIU
**                  - Option parameter
**                  - Response Waiting Time Index
**                  - Local Link Timeout
**                  - Inactivity Timeout as initiator role
**                  - Inactivity Timeout as target role
**                  - Delay SYMM response
**                  - Data link connection timeout
**                  - Delay timeout to send first PDU as initiator
**
** Returns          None
**
*******************************************************************************/
NFC_API extern void NFA_P2pGetLLCPConfig (UINT16 *p_link_miu,
                                          UINT8  *p_opt,
                                          UINT8  *p_wt,
                                          UINT16 *p_link_timeout,
                                          UINT16 *p_inact_timeout_init,
                                          UINT16 *p_inact_timeout_target,
                                          UINT16 *p_symm_delay,
                                          UINT16 *p_data_link_timeout,
                                          UINT16 *p_delay_first_pdu_timeout);

/*******************************************************************************
**
** Function         NFA_P2pSetTraceLevel
**
** Description      This function sets the trace level for P2P.  If called with
**                  a value of 0xFF, it simply returns the current trace level.
**
** Returns          The new or current trace level
**
*******************************************************************************/
NFC_API extern UINT8 NFA_P2pSetTraceLevel (UINT8 new_level);

#ifdef __cplusplus
}
#endif

#endif /* NFA_P2P_API_H */

